#pragma once
#include <string>
#include <vector>
#include <filesystem>
class FileTool
{
public:
    // 创建文件目录
    inline static bool createDir(const std::string &path)
    {
        return std::filesystem::create_directory(path);
    }
    // 创建文件
    static bool createFile(const char* path);
    static bool createFile(const std::string &path){
        return createFile(path.c_str());
    }
    static bool createFile(const std::string &path,size_t size);
    // 删除文件
    static bool deleteFile(const std::string &path);
    static bool renameFile(const std::string &oldPath, const std::string &newPath){
        std::filesystem::path oldPath_(oldPath);
        if(!std::filesystem::exists(oldPath_)){
            return false;
        }
        std::filesystem::path newPath_(newPath);
        std::filesystem::rename(oldPath_, newPath_);
        return true;
    }
    // 获取目录下所有的文件名
    static void getFileList(const char *dirPath, std::vector<std::string> &files);
    inline static void getFileList(const std::string &dirPath, std::vector<std::string> &files){
        getFileList(dirPath.c_str(), files);
    }
    inline static std::vector<std::string> getFileList(const char *dirPath)
    {
        std::vector<std::string> files;
        getFileList(dirPath, files);
        return files;
    }
    inline static std::vector<std::string> getFileList(const std::string &dirPath)
    {
        std::vector<std::string> files;
        getFileList(dirPath.c_str(), files);
        return files;
    }
    // 获取文件类型和权限,生成linux权限字符串例如“-rw-r--r--”
    static void getPermissions(const std::filesystem::file_status &status, std::string &perm);
    static void getPermissions(const std::filesystem::path &path, std::string &perm)
    {
        getPermissions(std::filesystem::status(path), perm);
    }
    static std::string getPermissions(const std::filesystem::path &path)
    {
        std::string perm;
        getPermissions(std::filesystem::status(path), perm);
        return perm;
    }
#if defined(__GNUC__)||!defined(_WIN32)
    static void getPermissions(const struct stat& st, std::string &perm);
#ifndef _WIN32
    static std::string getUsername(int uid);
    static std::string getGroupname(int gid);
#endif
#endif
    // 获取文件所属者
    static std::string getUsername(const std::string &path);
    // 获取文件所属组
    static std::string getGroupname(const std::string &path);
    // 获取文件大小
    static std::uintmax_t getFileSize(const std::string &path);
    // 获取文件的硬链接数
    static int getHardLinks(const std::string &path);
};

namespace xcom
{
    void getFileList(const char *dirPath, std::vector<std::string> &files);
    inline void getFileList(const std::string &dirPath, std::vector<std::string> &files){
        getFileList(dirPath.c_str(), files);
    }
    inline std::vector<std::string> getFileList(const char *dirPath)
    {
        std::vector<std::string> files;
        getFileList(dirPath, files);
        return files;
    }
    inline std::vector<std::string> getFileList(const std::string &dirPath)
    {
        std::vector<std::string> files;
        getFileList(dirPath.c_str(), files);
        return files;
    }
    void getPermissions(const std::filesystem::file_status &status, std::string &perm);
}